/*
 *  soapUI, copyright (C) 2006 eviware.com 
 *
 *  soapUI is free software; you can redistribute it and/or modify it under the 
 *  terms of the GNU Lesser General Public License as published by the Free Software Foundation; 
 *  either version 2.1 of the License, or (at your option) any later version.
 *
 *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
 *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 *  See the GNU Lesser General Public License for more details at gnu.org.
 */

package at.ac.tuwien.infosys.dsg.daios.wsdl.parser.soapui;

import java.io.IOException;
import java.net.URL;

import javax.xml.namespace.QName;

import org.apache.xmlbeans.SchemaType;
import org.apache.xmlbeans.SchemaTypeLoader;
import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
import org.xmlsoap.schemas.soap.envelope.EnvelopeDocument;

public class SoapVersion11 extends AbstractSoapVersion
{
   private final static QName envelopeQName  = new QName(Constants.SOAP11_ENVELOPE_NS, "Envelope");
   private final static QName bodyQName = new QName(Constants.SOAP11_ENVELOPE_NS, "Body");
   private final static QName faultQName = new QName(Constants.SOAP11_ENVELOPE_NS, "Fault");
   private final static QName headerQName = new QName(Constants.SOAP11_ENVELOPE_NS, "Header");
	
   SchemaTypeLoader soapSchema;
	SchemaType soapEnvelopeType;
	private XmlObject soapSchemaXml;
	private XmlObject soapEncodingXml;
	private SchemaType soapFaultType;
	
	public final static SoapVersion11 instance = new SoapVersion11();

   private SoapVersion11()
   {
   	ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
   	Thread.currentThread().setContextClassLoader( ClassLoader.getSystemClassLoader() );
   	
   	try
   	{
   		XmlOptions options = new XmlOptions();
         options.setCompileNoValidation();
         options.setCompileNoPvrRule();
         options.setCompileDownloadUrls();
         options.setCompileNoUpaRule();
         options.setValidateTreatLaxAsSkip();
   		
	   	soapSchemaXml = XmlObject.Factory.parse(new URL("file:soap/soapEnvelope.xsd"), options);
			soapSchema = XmlBeans.loadXsd(new XmlObject[] { soapSchemaXml });
	
	   	soapEnvelopeType = soapSchema.findDocumentType( envelopeQName );
	   	soapFaultType = soapSchema.findDocumentType( faultQName );
	   	
	   	soapEncodingXml = XmlObject.Factory.parse(new URL("file:soap/soapEncoding.xsd"), options);
   	}
   	catch( Exception e )
   	{
   		e.printStackTrace();
   	}
   	finally
   	{
   		Thread.currentThread().setContextClassLoader( contextClassLoader );
   	}
   }
   
	public SchemaType getEnvelopeType()
	{
		return EnvelopeDocument.type;
	}
	
	public String getEnvelopeNamespace()
	{
		return Constants.SOAP11_ENVELOPE_NS;
	}
	
	public String getEncodingNamespace()
	{
		return Constants.SOAP_ENCODING_NS;
	}

	public XmlObject getSoapEncodingSchema() throws XmlException, IOException
	{
		return soapEncodingXml;
	}

	public XmlObject getSoapEnvelopeSchema() throws XmlException, IOException
	{
		return soapSchemaXml;
	}
	
	public String toString()
	{
		return "SOAP 1.1";
	}

	public String getContentTypeHttpHeader(String encoding)
	{
		if (encoding == null || encoding.trim().length() == 0)
			return getContentType();
		else
			return getContentType() + ";charset=" + encoding;
	}

	public String getContentType()
	{
		return "text/xml";
	}

	public QName getBodyQName()
	{
		return bodyQName;
	}

	public QName getEnvelopeQName()
	{
		return envelopeQName;
	}

	public QName getHeaderQName()
	{
		return headerQName;
	}
	
	protected SchemaTypeLoader getSoapEnvelopeSchemaLoader()
	{
		return soapSchema;
	}

	public SchemaType getFaultType()
	{
		return soapFaultType;
	}
}
